package logger

import (
	"fmt"
	"log"
	"os"
	"time"
)

// ConsoleWriter 控制台日志写入器
type ConsoleWriter struct {
	logger         *log.Logger     // 标准日志记录器
	color          bool            // 是否启用颜色输出
	outputTemplate string          // 输出模板，支持变量替换
	parser         *TemplateParser // 模板解析器
}

// NewConsoleWriter 创建控制台日志写入器
func NewConsoleWriter(color bool, outputTemplate string) (*ConsoleWriter, error) {
	parser := NewTemplateParser(outputTemplate)
	w := &ConsoleWriter{
		logger:         log.New(os.Stdout, "", 0),
		color:          color,
		outputTemplate: outputTemplate,
		parser:         parser,
	}

	return w, nil
}

// Open 实现 LogWriter 接口
func (w *ConsoleWriter) Open() error {
	return nil
}

// Write 实现 LogWriter 接口的控制台写入方法
func (w *ConsoleWriter) Write(level LogLevel, caller string, msg string) error {
	now := time.Now()

	// 设置日志内容的属性
	w.parser.WithProperty("Level", level)
	w.parser.WithProperty("Timestamp", now)
	w.parser.WithProperty("Message", msg)
	w.parser.WithProperty("Caller", caller)
	w.parser.WithProperty("Pid", os.Getpid())
	w.parser.WithProperty("Goroutine", getGoroutineID())

	// 使用预解析的属性列表解析模板
	content := w.parser.Parse()

	if w.color {
		cfg := ConsoleColorsMap[level]
		fmt.Printf("%s%s\033[0m", cfg.color, content)
	} else {
		fmt.Print(content)
	}
	return nil
}

// Close 实现 LogWriter 接口
func (w *ConsoleWriter) Close() error {
	// 控制台输出不需要特殊的关闭操作
	// 标准输出(os.Stdout)由系统管理,不需要手动关闭
	w.logger = nil
	return nil
}

type consoleColor struct {
	name  string // 日志级别名称
	color string // 控制台颜色代码
}

// ConsoleColorsMap 日志级别配置映射, 用于控制台输出;
// 用户可以自定义颜色, 例如: ConsoleColorsMap[LevelTrace] = {"TRACE", "\033[36m", false}
// 每个日志级别包含:
// - name: 日志级别名称
// - color: ANSI 颜色代码
// - exitAfter: 是否在记录后退出程序
var ConsoleColorsMap = map[LogLevel]consoleColor{
	LevelTrace:    {"TRACE", "\033[36m"},    // 青色
	LevelDebug:    {"DEBUG", "\033[34m"},    // 蓝色
	LevelInfo:     {"INFO", "\033[37m"},     // 白色
	LevelSuccess:  {"SUCCESS", "\033[32m"},  // 绿色
	LevelWarning:  {"WARNING", "\033[33m"},  // 黄色
	LevelError:    {"ERROR", "\033[31m"},    // 红色
	LevelCritical: {"CRITICAL", "\033[35m"}, // 紫色
	LevelFatal:    {"FATAL", "\033[91m"},    // 亮红色
}
